package br.com.afi.pattern.business;

import java.io.Serializable;
import java.util.List;

import br.com.afi.pattern.dao.GenericDAO;
import br.com.afi.pattern.model.Model;

/**
 * Essa classe abstrata possui as quatro operações básicas (Select, Insert, Update, Delete)
 * implementadas. Para que isso seja possível é necessário implementar o método
 * {@link #createDefaultDAO()}.
 * 
 * @author André de Fontana Ignacio
 * @version 1.0
 * @param <E> Tipo do Model (Entity)
 * @param <ID> Tipo do Id do Model (Entity)
 */
public abstract class AbstractBusinessImpl<E extends Model<ID>, ID extends Serializable> implements Business<E, ID>
{
	/**
	 * Construtor
	 */
	public AbstractBusinessImpl()
	{
		super();
	}

	/**
	 * Cria o DAO padrão para esta classe.
	 * 
	 * @return DAO
	 */
	public abstract GenericDAO<E, ID> createDefaultDAO();

	@Override
	public void delete( E e ) throws BusinessException
	{
		final GenericDAO<E, ID> dao = this.createDefaultDAO();
		dao.makeTransient( e );
	}

	@Override
	public List<E> findAll()
	{
		final GenericDAO<E, ID> dao = this.createDefaultDAO();
		return dao.findAll();
	}

	@Override
	public E findById( ID id )
	{
		final GenericDAO<E, ID> dao = this.createDefaultDAO();
		return dao.findById( id, false );
	}

	@Override
	public boolean existsById( ID id )
	{
		final GenericDAO<E, ID> dao = this.createDefaultDAO();
		return dao.existsById( id );
	}

	@Override
	public E save( E e ) throws BusinessException
	{
		final GenericDAO<E, ID> dao = this.createDefaultDAO();
		return dao.makePersistent( e );
	}

}
